package pe.edu.pucp.notasmoviles.persistence.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import pe.edu.pucp.notasmoviles.domain.Usuario;
import pe.edu.pucp.notasmoviles.persistence.UsuarioDao;

public class UsuarioDaoJdbc extends SimpleJdbcDaoSupport implements UsuarioDao {

	// Inyeccion por constructor
	@Autowired
	public UsuarioDaoJdbc(DataSource dataSource) {
		// El dataSource es requerido para que funcione el Dao
		setDataSource(dataSource);
	}

	public Usuario getUsuarioPorUsername(String username) {
		return getSimpleJdbcTemplate()
				.queryForObject(
						"select username, password, nombre from usuario where username=?",
						new UsuarioMapper(), username);
	}

	public List<Usuario> getUsuarios() {
		return getSimpleJdbcTemplate().query(
				"select username, password, nombre from usuario",
				new UsuarioMapper());
	}

	private class UsuarioMapper implements RowMapper<Usuario> {
		// Mapea un ResultSet a un bean
		public Usuario mapRow(ResultSet rs, int i) throws SQLException {
			Usuario usuario = new Usuario();
			usuario.setUsername(rs.getString("username"));
			usuario.setPassword(rs.getString("password"));
			usuario.setNombre(rs.getString("nombre"));
			return usuario;
		}
	}

	public void insertar(Usuario nuevo) {
		getSimpleJdbcTemplate()
				.update(
						"insert into usuario(username, password, nombre) values(?, ?, ?)",
						nuevo.getUsername(), nuevo.getPassword(),
						nuevo.getNombre());

	}

	public void actualizar(Usuario usuario) {
		getSimpleJdbcTemplate().update(
				"update usuario set password=?, nombre=? where username=?",
				usuario.getPassword(), usuario.getNombre(),
				usuario.getUsername());

	}

	public void eliminar(Usuario usuario) {
		getSimpleJdbcTemplate().update("delete from usuario where username=?",
				usuario.getUsername());

	}

	public int getCountUsuarios() {
		return getSimpleJdbcTemplate().queryForInt("select count(*) from usuario");
	}
}
